package com.AdvancedDemos.枚举;

/**
 * 直接用enum关键字替换class即可创建枚举类
 * <p>
 * 枚举类第一行只能罗列一系列常量(相当于public static final 修饰),每个常量都是枚举类的一个对象,可以赋给枚举类型的变量
 * <p>
 * 枚举类都是最终类,其字节码文件中有final修饰,且没有类外可见的构造函数,不可以被继承
 * <p>
 * 枚举类的构造器都是私有的(写不写都是私有的),因此枚举类在类外不能创建对象
 * <p>
 * 从第二行开始,可以定义类的其他各种成员
 * <p>
 * 枚举类都是继承自 extends java.lang.Enum 类,该系统类中有一些其他函数可以使用
 * <p>
 * 如果枚举类中第一行只写一个常量,其对应一个实例,而枚举类外又无法new出新的对象,那么该类就是单例模式
 */


enum A {
    X, Y, Z, //这里相当于调用A类型的无参构造函数创建了3个A类型的对象
    A("wtp"), B("abc");//在定义枚举常量时也可以调用带参的构造函数

    public static int a;
    String name;

    private A() {

    }

    private A(String name) {

    }

    protected void printHelloWorld() {
        System.out.println("com.AdvancedDemos.FileAndIO.HelloWorld!");
    }
}

/**
 * javap反编译后的结果:
 * C:\Users\WangTianpei\Desktop>javap A.class
 * Compiled from "A.java"
 * public final class A extends java.lang.Enum {
 * public static final A X = new A();
 * public static final A Y = new A();
 * public static final A Z = new A();
 * public static A[] values();
 * public static A valueOf(java.lang.String);
 * static {};
 * }
 */


/*
测试枚举类
 */
public class Enumerate {
    public static void main(String[] args) {
        /**
         * Java中枚举是一种类
         */
        A a1 = A.X;
        A a2 = A.Y;
        A a3 = A.Z;

        //调用枚举类中继承的系统类Enum中的ordinal方法,返回该对象在枚举类第一行对应的位置下标,从0下标开始
        /*ordinal n. 序数 adj. 序数的*/
        System.out.println(a1.ordinal());//0
        System.out.println(a2.ordinal());//1
        System.out.println(a3.ordinal());//2


        System.out.println("----------------");
        //调用枚举类中的静态方法values()返回A[],当中是枚举类A中全部对象的数组形式
        A[] arr = A.values();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i].toString() + "  " + arr[i].ordinal());
        }
        //X  0
        //Y  1
        //Z  2
        System.out.println("----------------");


        //调用枚举类中的静态方法valueOf(str)返回字符串str对应的常量对应的对象
        A temp = A.valueOf("X");
        System.out.println(temp.ordinal() + "   " + temp.toString());//0   X
    }
}
